/**
 * Copyright(c) kyle.
 */
package org.example.jvm;

/**
 * 测试完成的顺序
 * <p>
 * 父类--静态变量
 * 父类--静态初始化块
 * 子类--静态变量
 * 子类--静态初始化块
 * 父类--变量
 * 父类--初始化块
 * 父类--构造器
 * 子类--变量
 * 子类--初始化块
 * 子类--构造器
 *
 * @author kyle
 * @version 1.00.00
 * @updateUser [Kyle]
 * @updateRemark [说明本次修改内容]
 * @date [2021-09-26 17:00]
 * @since [2021-09-26 17:00]
 */
public class KlassInitialOrderTest {
    public static String staticField = "静态变量";//变量

    static {
        System.out.println(staticField);
        System.out.println("静态初始化块");
    }//初始化块

    public String field = "变量";//静态初始化块

    {
        System.out.println(field);
        System.out.println("初始化块");
    }//构造器

    public KlassInitialOrderTest() {
        System.out.println("构造器");
    }

    public static void main(String[] args) {
        System.out.println("___________");
        new KlassInitialOrderTest();//触发初始化块和构造器
        System.out.println("___________");
        System.out.println(Klass2.staticField);
        System.out.println("___________");
        System.out.println(Klass2.staticField2);
        System.out.println("___________");
        new Klass2();
    }

    public static class Klass2 {
        public final static String staticField = "静态变量2";//不会触发静态初始化块
        public static String staticField2 = "静态变量3";//会触发静态初始化块

        static {
            System.out.println(staticField);
            System.out.println("静态内部类静态初始化块");
        }//初始化块

        public String field = "静态内部类变量";//静态初始化块

        {
            System.out.println(field);
            System.out.println("静态内部类初始化块");
        }
    }
}
